﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace OpenSubtitlesDownloader {
	internal class MovieHasher {
		public static byte[] ComputeMovieHash(string filename) {
			byte[] result;
			using (Stream input = File.OpenRead(filename)) {
				result = ComputeMovieHash(input);
			}
			return result;
		}

		public static byte[] ComputeMovieHash(Stream input) {
			long lhash, streamsize;
			streamsize = input.Length;
			lhash = streamsize;

			long i = 0;
			byte[] buffer = new byte[sizeof(long)];
			while (i < 65536 / sizeof(long) && (input.Read(buffer, 0, sizeof(long)) > 0)) {
				i++;
				lhash += BitConverter.ToInt64(buffer, 0);
			}

			input.Position = Math.Max(0, streamsize - 65536);
			i = 0;
			while (i < 65536 / sizeof(long) && (input.Read(buffer, 0, sizeof(long)) > 0)) {
				i++;
				lhash += BitConverter.ToInt64(buffer, 0);
			}
			input.Close();
			byte[] result = BitConverter.GetBytes(lhash);
			Array.Reverse(result);
			return result;
		}

		public static string ToHexadecimal(byte[] bytes) {
			StringBuilder hexBuilder = new StringBuilder();
			for (int i = 0; i < bytes.Length; i++) {
				hexBuilder.Append(bytes[i].ToString("x2"));
			}
			return hexBuilder.ToString();
		}
	}
}
